Restrictions এবং Projections এর ব্যবহার

Hibernate Criteria API - হাইবারনেট (Hibernate) - Java Technologies

336

Restrictions এবং Projections Hibernate এর দুটি শক্তিশালী ফিচার, যা Criteria API ব্যবহার করে queries তৈরি করতে সহায়ক। এগুলি ডেটা রিট্রিভ করার প্রক্রিয়া আরও ফ্লেক্সিবল এবং কার্যকরী করতে ব্যবহৃত হয়, বিশেষ করে যখন আপনাকে complex filtering বা specific fields চয়ন করতে হয়।

এই অংশে Restrictions এবং Projections কীভাবে কাজ করে এবং তাদের ব্যবহার কীভাবে ডেটা রিট্রিভাল অপটিমাইজ করতে সাহায্য করে তা আলোচনা করা হবে।


1. Restrictions

Restrictions Hibernate Criteria API-তে queries কাস্টমাইজ করার জন্য ব্যবহৃত হয়। এটি filtering এবং conditional expressions এর মাধ্যমে ডেটা সংগ্রহের জন্য অত্যন্ত কার্যকর। Restrictions ব্যবহার করে আপনি where conditions, like, between, equals, ইত্যাদি বিভিন্ন ধরনের শর্ত ব্যবহার করতে পারেন।

Common Restrictions:

  • eq (Equal)
  • ne (Not Equal)
  • like (Pattern Matching)
  • between (Range Filtering)
  • gt, lt, ge, le (Greater Than, Less Than, Greater or Equal, Less or Equal)
  • isNull, isNotNull (Null Check)

Example: Using Restrictions to Filter Data

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import java.util.List;

public class RetrieveExample {
    public static void main(String[] args) {
        // Step 1: Create session factory and session
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
                .addAnnotatedClass(Employee.class)
                .buildSessionFactory();

        Session session = factory.getCurrentSession();

        try {
            // Step 2: Begin transaction
            session.beginTransaction();

            // Step 3: Use Criteria to apply Restrictions (filter employees with salary greater than 50000)
            List<Employee> employees = session.createCriteria(Employee.class)
                                              .add(Restrictions.gt("salary", 50000))
                                              .list();

            // Step 4: Display the results
            for (Employee emp : employees) {
                System.out.println(emp);
            }

            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

Explanation:

  • Restrictions.gt("salary", 50000): এই restriction salary ফিল্ডের জন্য একটি শর্ত তৈরি করে যা 50000 এর চেয়ে বড় মান রিটার্ন করবে।
  • createCriteria(Employee.class): এটি Employee ক্লাসের উপর একটি Criteria query তৈরি করে।

2. Projections

Projections Hibernate Criteria API-তে ব্যবহার করা হয়, যখন আপনি specific fields (columns) বা aggregated results (যেমন COUNT, SUM) রিটার্ন করতে চান। Projection মূলত SQL-এর SELECT কুয়েরি অংশের মতো কাজ করে, যার মাধ্যমে আপনি কোন ফিল্ড বা ডেটা রিটার্ন করবেন তা নিয়ন্ত্রণ করতে পারেন।

Common Projections:

  • property: একটি নির্দিষ্ট প্রপার্টি (ফিল্ড) রিটার্ন করতে ব্যবহার করা হয়।
  • rowCount: মোট রেকর্ডের সংখ্যা জানতে।
  • sum, avg, min, max: ডেটার গাণিতিক পরিসংখ্যান বের করার জন্য।

Example: Using Projections to Select Specific Fields

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Projections;
import java.util.List;

public class RetrieveExample {
    public static void main(String[] args) {
        // Step 1: Create session factory and session
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
                .addAnnotatedClass(Employee.class)
                .buildSessionFactory();

        Session session = factory.getCurrentSession();

        try {
            // Step 2: Begin transaction
            session.beginTransaction();

            // Step 3: Using Projections to retrieve only "name" and "salary" columns
            List<Object[]> results = session.createCriteria(Employee.class)
                                            .setProjection(Projections.projectionList()
                                                                    .add(Projections.property("name"))
                                                                    .add(Projections.property("salary")))
                                            .list();

            // Step 4: Display the results
            for (Object[] result : results) {
                System.out.println("Employee Name: " + result[0] + ", Salary: " + result[1]);
            }

            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

Explanation:

  • Projections.property("name"): এটি শুধুমাত্র name ফিল্ডটি রিটার্ন করার জন্য ব্যবহৃত হয়।
  • Projections.property("salary"): এটি salary ফিল্ডের মান রিটার্ন করে।
  • setProjection(Projections.projectionList()): এটি একাধিক ফিল্ড নির্বাচন করার জন্য ব্যবহৃত হয়।

3. Using Projections with Aggregation Functions

Projections শুধুমাত্র একক ফিল্ড বা ডেটা রিটার্ন করতে নয়, বরং aggregation functions (যেমন COUNT, SUM, AVG, MIN, MAX) হিসাব করতে সাহায্য করে।

Example: Using Projections for Aggregation (SUM, COUNT)

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Projections;

public class RetrieveExample {
    public static void main(String[] args) {
        // Step 1: Create session factory and session
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
                .addAnnotatedClass(Employee.class)
                .buildSessionFactory();

        Session session = factory.getCurrentSession();

        try {
            // Step 2: Begin transaction
            session.beginTransaction();

            // Step 3: Use Projections to calculate the total salary of all employees
            Double totalSalary = (Double) session.createCriteria(Employee.class)
                                                  .setProjection(Projections.sum("salary"))
                                                  .uniqueResult();

            System.out.println("Total Salary: " + totalSalary);

            // Step 4: Use Projections to count the number of employees
            Long employeeCount = (Long) session.createCriteria(Employee.class)
                                              .setProjection(Projections.rowCount())
                                              .uniqueResult();

            System.out.println("Total Employees: " + employeeCount);

            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

Explanation:

  • Projections.sum("salary"): এটি সমস্ত salary ফিল্ডের মোট যোগফল রিটার্ন করবে।
  • Projections.rowCount(): এটি টেবিলের মোট রেকর্ড (কাউন্ট) রিটার্ন করবে।

4. Combining Restrictions and Projections

Hibernate Criteria API-তে Restrictions এবং Projections একসাথে ব্যবহার করা সম্ভব, যেখানে আপনি একদিকে শর্ত আরোপ (filtering) করবেন এবং অন্যদিকে নির্দিষ্ট ফিল্ড বা অ্যাগ্রিগেটেড ভ্যালু রিটার্ন করবেন।

Example: Using Restrictions and Projections Together

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Projections;

public class RetrieveExample {
    public static void main(String[] args) {
        // Step 1: Create session factory and session
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
                .addAnnotatedClass(Employee.class)
                .buildSessionFactory();

        Session session = factory.getCurrentSession();

        try {
            // Step 2: Begin transaction
            session.beginTransaction();

            // Step 3: Use Restrictions and Projections together
            List<Object[]> results = session.createCriteria(Employee.class)
                                            .add(Restrictions.gt("salary", 30000))
                                            .setProjection(Projections.projectionList()
                                                                    .add(Projections.property("name"))
                                                                    .add(Projections.property("salary")))
                                            .list();

            // Step 4: Display the results
            for (Object[] result : results) {
                System.out.println("Employee Name: " + result[0] + ", Salary: " + result[1]);
            }

            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

Explanation:

  • Restrictions.gt("salary", 30000): এখানে salary এর মান ৩০,০০০ এর চেয়ে বড় হওয়া উচিত।
  • Projections.property("name") এবং Projections.property("salary"): এখানে name এবং salary রিটার্ন করা হচ্ছে যেগুলি salary > 30000 শর্তে ফিল্টার করা হয়েছে।

Hibernate Criteria API-তে Restrictions এবং Projections ব্যবহারের মাধ্যমে আপনি ডেটা ফিল্টার এবং কাস্টমাইজ করতে পারেন। এই দুই ফিচারের মাধ্যমে:

  • Restrictions আপনাকে ডেটা রিট্রিভ করার জন্য শর্ত এবং ফিল্টার অ্যাপ্লাই করতে সাহায্য করে (যেমন, like, equal, greaterThan, ইত্যাদি)।
  • Projections আপনাকে নির্দিষ্ট ফিল্ড বা অ্যাগ্রিগেটেড রেজাল্ট (যেমন, COUNT, SUM, AVG) রিটার্ন করতে সাহায্য করে।

এই দুটি ফিচারের সঠিক ব্যবহার আপনার কোডকে আরও কার্যকরী, নমনীয় এবং পারফরম্যান্স অপটিমাইজড করতে সাহায্য করবে।

Content added By
Promotion

Are you sure to start over?

Loading...